// 购物车状态
export default {
  namespaced: true,
  state: () => ({
    // 购物车列表数据
    list: []
  }),
  getters: {
    /**
     * 1. 有效商品列表=》无效商品（没库存或下架了）
      2. 选中的购物车商品数据
      3. 选中商品总价
      4. 购物车中有效商品是否是全部选中状态
     * @param {*} state
     * @returns
     */
    // 有效商品列表
    validList: state => {
      return state.list.filter(item => item.isEffective)
    },
    // 有效商品列表选中商品
    validSeled: (state, getters) => {
      return getters.validList.filter(item => item.selected)
    },
    // 有效商品列表选中商品的总价
    validSeledTotal (state, getters) {
      return getters.validSeled.reduce((acc, good) => (acc += good.count * good.nowPrice), 0)
    },
    // 有效商品列表是否是全部选中状态
    isAll (state, getters) {
      return getters.validList.every(good => good.selected)
    }
  },
  mutations: {
    // 加入购物车：向list中添加商品
    /**
     *
     * @param {*} state 获取变量对象
     * @param {*} good 当前加入list商品数据
     */
    addCart (state, good) {
      /**
       * 把sku选择的商品unshift到list？
       * 不行=》排重
       * 思路：根据skuId判断是否之前加入过
       *    1. 加入过=》累加数量
       *    2. 没加入过 =》 unshift到list（新增）
       */
      const addedIndex = state.list.findIndex(item => item.skuId === good.skuId)
      if (addedIndex > -1) {
        // 加入过
        state.list[addedIndex].count += good.count
      } else {
        // 没加入过
        state.list.unshift(good)
      }
    },
    // 商品单选
    /**
     *
     * @param {*} state
     * @param {*} { good 当前选择的商品, sel选中状态 }
     */
    singleCheck (state, { good, sel }) {
      /**
       * 1. 根据good找到单选商品
       * 2. 修改找到商品的选中状态
       */
      const currGood = state.list.find(item => item.skuId === good.skuId)
      currGood.selected = sel
    },
    // 全选
    /**
     *
     * @param {*} state
     * @param {*} sel 全选框选中状态
     */
    allCheck (state, sel) {
      state.list.forEach(item => {
        item.selected = sel
      })
    },
    /**
     *
     * @param {*} state
     * @param {*} good 当前要删除商品
     */
    delCart (state, good) {
      /**
       * 1. 根据good找到要删除商品索引值
       * 2. 通过splice删除
       */
      const i = state.list.findIndex(item => item.skuId === good.skuId)
      state.list.splice(i, 1)
    },
    setCount (state, { good, newCount }) {
      const currGood = state.list.find(item => item.skuId === good.skuId)
      currGood.count = newCount
    }
  },
  actions: {
    /**
     * 加入购物车action(异步)
     * 思路：区分是否登录=》1. 未登录，直接调用addCart存本地 2. 登陆了，调用接口存到数据库
     * @param {*} param{commit, rootState获取其它模块的state变量}
     * @param {*} good 当前加入list商品数据
     * return Promise对象
     */
    addCartAction ({ commit, rootState }, good) {
      // console.log(rootState)
      if (rootState.user.profile.token) {
        // 已经登录（调用接口存到数据库）=》随后会实现
      } else {
        // 没有登录
        commit('addCart', good)
        return '加入购物车成功！'
      }
    },
    // 单选
    singleCheckAction ({ commit, rootState }, { good, sel }) {
      // console.log(rootState)
      if (rootState.user.profile.token) {
        // 已经登录（调用接口存到数据库）=》随后会实现
      } else {
        // 没有登录
        commit('singleCheck', { good, sel })
      }
    },
    // 全选
    allCheckAction ({ commit, rootState }, sel) {
      // console.log(rootState)
      if (rootState.user.profile.token) {
        // 已经登录（调用接口存到数据库）=》随后会实现
      } else {
        // 没有登录
        commit('allCheck', sel)
      }
    },
    // 删除
    delCartAction ({ commit, rootState }, good) {
      // console.log(rootState)
      if (rootState.user.profile.token) {
        // 已经登录（调用接口存到数据库）=》随后会实现
      } else {
        // 没有登录
        commit('delCart', good)
      }
    },
    // 修改数量
    setCountAction ({ commit, rootState }, { good, newCount }) {
      // console.log(rootState)
      if (rootState.user.profile.token) {
        // 已经登录（调用接口存到数据库）=》随后会实现
      } else {
        // 没有登录
        commit('setCount', { good, newCount })
      }
    }

  }
}
